﻿#pragma once


#include <QtCore/QObject>
#include <QtCore/QFile>
#include <QtCore/QTextStream>

// 使用OutputDebugString输出日志信息，即使release模式，debug模式下默认会输出
#define LOG_TO_OutputDebugString


// 对于release版本需要添加预定义QT_MESSAGELOGCONTEXT，不然会没有函数、文件、行号等信息


// 无论debug还是release都会输出调试信息到文件中
class QtKLog : public QObject
{
    Q_OBJECT
public:
    QtKLog(QObject *parent = nullptr);
    ~QtKLog();
public:
    static QtKLog& Instance();
public:
    // 安装自定义日志处理函数
    void InstallMessageHandler();
    // 恢复日志处理函数
    void UninstallMessageHandler();
public:
    // 关闭文件
    void CloseLogFile();
    // 输入日志到文件
    void WriteLogFile(QString strMessage);
    // 创建日志文件
    bool CreateLogFile();
    // 是否写入文件,CreateLEogFile()函数内会设置为true
    bool WriteLogFile();
    void SetWriteLogFile(bool bVal);
    // 是否发送日志内容信号
    bool SendLogSignal();
    void SetSendLogSignal(bool bVal);
    // 日志内容是否包含上下文信息， false为包含
    bool Single();
    void SetSingle(bool bVal);
signals:
    // 日志内容信号
    void signalLogMsg(QString strLog);
public:
    // 自定义日志消息处理程序
    /*static void KMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);*/
    static void KMessageLogOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
protected:
    // 日志文件对象
    QFile mFile;
    QTextStream mStream;
    // 是否已经打开日志文件
    bool mbOpen = false;
    // 是否发送日志内容信号
    bool mbSendLogSignal = false;
    // 是否写入文件
    bool mbWriteLogFile = false;
    // 日志内容是否包含上下文信息， false为包含
    bool mbSingle = false;
    // 旧的日志输出处理函数
    QtMessageHandler mhOldMessageHandler = nullptr;
};
